package com.score;

import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioTrack;

public class AudioPlayer {
    private AudioTrack audioTrack;
    private byte[] audioData1; // 伴奏数据
    private byte[] audioData2; // 原唱数据
    private int currentIndex = 0; // 当前播放的音频索引
    private int offset = 0; // 当前音频数据的偏移量
    private int bufferSizeInBytes;
    private boolean isPlaying = true;

    // 初始化AudioTrack和其他资源
    public void initAudioTrack( byte[] banzuo, byte[] yuanchang) {
        // 配置AudioTrack参数（采样率、通道配置、音频格式等）
        // ...
        audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, 44100, AudioFormat.CHANNEL_OUT_STEREO,
                AudioFormat.ENCODING_PCM_16BIT, AudioTrack.getMinBufferSize(44100,
                AudioFormat.CHANNEL_OUT_STEREO,
                AudioFormat.ENCODING_PCM_16BIT), AudioTrack.MODE_STREAM);
        int sampleRateInHz = 44100;
        int channelConfig = AudioFormat.CHANNEL_OUT_STEREO;
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;
        bufferSizeInBytes = AudioTrack.getMinBufferSize(sampleRateInHz, channelConfig, audioFormat);

    }

    // 加载音频数据的方法（这里省略了实际加载数据的逻辑）
    private void loadAudioData1() {
        // ...加载audioData1...
    }

    private void loadAudioData2() {
        // ...加载audioData2...
    }

    // 播放音频的循环方法
    public void playAudioLoop() {
        // 假设你已经加载了音频数据

        audioTrack.play(); // 开始播放

        while (isPlaying) { // 假设isPlaying是一个标志位，用于控制循环是否继续
            // 根据当前索引选择音频数据
            byte[] audioData = (currentIndex == 0) ? audioData1 : audioData2;

            // 计算需要写入的音频数据量（基于AudioTrack的缓冲区大小和当前偏移量）
            int writeSize = Math.min(audioData.length - offset, bufferSizeInBytes);

            // 写入音频数据到AudioTrack
            audioTrack.write(audioData, offset, writeSize);

            // 更新偏移量
            offset += writeSize;

            // 如果到达音频数据的末尾，则重置偏移量并可能切换音频
            if (offset >= audioData.length) {
                offset = 0; // 重置偏移量以循环播放

                // 如果需要，可以切换音频索引
                // currentIndex = (currentIndex == 0) ? 1 : 0; // 切换伴奏和原唱

                // 注意：在实际应用中，你可能需要更复杂的逻辑来管理切换
            }

            // 等待一段时间，避免过于频繁地检查播放状态或写入数据
            // 你可以使用Thread.sleep()、Handler.postDelayed()或其他方法来实现等待
            // ...
        }

        audioTrack.stop(); // 停止播放
        audioTrack.release(); // 释放资源
    }

    // 切换音频的方法
    public void switchAudio(int newIndex) {
        // 停止播放（如果需要）
        // ...

        // 更新当前索引
        currentIndex = newIndex;

        // 重置偏移量并继续播放（如果需要）
        // ...
    }

    // 其他必要的配置和初始化代码
    // ...
}